from _typeshed import Incomplete
from typing import Any, final

class AssertingBaseClass:
    def __new__(cls, /, expected_type: type) -> AssertingBaseClass: ...

@final
class ClassWithDecorators:
    def __new__(cls, /) -> ClassWithDecorators: ...
    @property
    def attr(self, /) -> int: ...
    @attr.setter
    def attr(self, /, value: int) -> None: ...
    @classmethod
    @property
    def cls_attribute(cls, /) -> int: ...
    @classmethod
    def cls_method(cls, /) -> int: ...
    @staticmethod
    def static_method() -> int: ...

@final
class ClassWithDict:
    def __new__(cls, /) -> ClassWithDict: ...

@final
class ClassWithoutConstructor: ...

@final
class EmptyClass:
    def __len__(self, /) -> int: ...
    def __new__(cls, /) -> EmptyClass: ...
    def method(self, /) -> None: ...

@final
class PlainObject:
    @property
    def bar(self, /) -> int: ...
    @bar.setter
    def bar(self, /, value: int) -> None: ...
    @property
    def foo(self, /) -> str: ...
    @foo.setter
    def foo(self, /, value: str) -> None: ...

@final
class PyClassIter:
    def __new__(cls, /) -> PyClassIter: ...
    def __next__(self, /) -> int: ...

@final
class PyClassThreadIter:
    def __new__(cls, /) -> PyClassThreadIter: ...
    def __next__(self, /) -> int: ...

@final
class SubClassWithInit(dict):
    def __init__(self, /, *args, **kwargs) -> Any: ...
    def __new__(cls, /, *args, **kwargs) -> SubClassWithInit: ...

def map_a_class(
    cls: EmptyClass | tuple[EmptyClass, EmptyClass] | Incomplete,
) -> EmptyClass | tuple[EmptyClass, EmptyClass] | Incomplete: ...
